{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>yr</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>...</th>\n",
       "      <th>weathersit_1</th>\n",
       "      <th>weathersit_2</th>\n",
       "      <th>weathersit_3</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>cnt</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0.110792</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0.089623</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0.152669</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0.177174</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0.181546</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  yr  season_1  season_2  season_3  season_4  mnth_1  mnth_2  \\\n",
       "0        1   0         1         0         0         0       1       0   \n",
       "1        2   0         1         0         0         0       1       0   \n",
       "2        3   0         1         0         0         0       1       0   \n",
       "3        4   0         1         0         0         0       1       0   \n",
       "4        5   0         1         0         0         0       1       0   \n",
       "\n",
       "   mnth_3  mnth_4     ...      weathersit_1  weathersit_2  weathersit_3  \\\n",
       "0       0       0     ...                 0             1             0   \n",
       "1       0       0     ...                 0             1             0   \n",
       "2       0       0     ...                 1             0             0   \n",
       "3       0       0     ...                 1             0             0   \n",
       "4       0       0     ...                 1             0             0   \n",
       "\n",
       "       temp     atemp       hum  windspeed       cnt  holiday  workingday  \n",
       "0  0.355170  0.373517  0.828620   0.284606  0.110792        0           0  \n",
       "1  0.379232  0.360541  0.715771   0.466215  0.089623        0           0  \n",
       "2  0.171000  0.144830  0.449638   0.465740  0.152669        0           1  \n",
       "3  0.175530  0.174649  0.607131   0.284297  0.177174        0           1  \n",
       "4  0.209120  0.197158  0.449313   0.339143  0.181546        0           1  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd # SQL数据处理\n",
    "\n",
    "df = pd.read_csv(\"FE_day.csv\")\n",
    "#通过观察前5行，了解数据每列（特征）的概况\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 35 columns):\n",
      "instant         731 non-null int64\n",
      "yr              731 non-null int64\n",
      "season_1        731 non-null int64\n",
      "season_2        731 non-null int64\n",
      "season_3        731 non-null int64\n",
      "season_4        731 non-null int64\n",
      "mnth_1          731 non-null int64\n",
      "mnth_2          731 non-null int64\n",
      "mnth_3          731 non-null int64\n",
      "mnth_4          731 non-null int64\n",
      "mnth_5          731 non-null int64\n",
      "mnth_6          731 non-null int64\n",
      "mnth_7          731 non-null int64\n",
      "mnth_8          731 non-null int64\n",
      "mnth_9          731 non-null int64\n",
      "mnth_10         731 non-null int64\n",
      "mnth_11         731 non-null int64\n",
      "mnth_12         731 non-null int64\n",
      "weekday_0       731 non-null int64\n",
      "weekday_1       731 non-null int64\n",
      "weekday_2       731 non-null int64\n",
      "weekday_3       731 non-null int64\n",
      "weekday_4       731 non-null int64\n",
      "weekday_5       731 non-null int64\n",
      "weekday_6       731 non-null int64\n",
      "weathersit_1    731 non-null int64\n",
      "weathersit_2    731 non-null int64\n",
      "weathersit_3    731 non-null int64\n",
      "temp            731 non-null float64\n",
      "atemp           731 non-null float64\n",
      "hum             731 non-null float64\n",
      "windspeed       731 non-null float64\n",
      "cnt             731 non-null float64\n",
      "holiday         731 non-null int64\n",
      "workingday      731 non-null int64\n",
      "dtypes: float64(5), int64(30)\n",
      "memory usage: 200.0 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从原始数据中分离输入特征x和输出y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "y = df[\"cnt\"]\n",
    "X = df.drop([\"cnt\",\"instant\"], axis = 1) #那个序号instant与特征无关，去掉\n",
    "\n",
    "#特征名称，用于后续显示权重系数对应的特征\n",
    "feat_names = X.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对全体数据，随机选择其中80%做训练数据，剩下20%为测试数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(584, 33)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.2)\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1）用训练数据训练最小二乘线性回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>3.422621e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>1.549163e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>1.549163e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>1.549163e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>1.549163e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>1.549163e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>8.029111e+11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>8.029111e+11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>temp</td>\n",
       "      <td>3.176716e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>yr</td>\n",
       "      <td>2.317455e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>atemp</td>\n",
       "      <td>1.018338e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-1.380822e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>hum</td>\n",
       "      <td>-1.568790e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>workingday</td>\n",
       "      <td>-7.462522e+11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-7.462522e+11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>season_4</td>\n",
       "      <td>-3.771365e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>season_2</td>\n",
       "      <td>-3.771365e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>season_3</td>\n",
       "      <td>-3.771365e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-3.771365e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>-3.978377e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>-3.978377e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>-3.978377e+12</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns          coef\n",
       "13        mnth_9  3.422621e+12\n",
       "9         mnth_5  3.422621e+12\n",
       "10        mnth_6  3.422621e+12\n",
       "12        mnth_8  3.422621e+12\n",
       "14       mnth_10  3.422621e+12\n",
       "7         mnth_3  3.422621e+12\n",
       "8         mnth_4  3.422621e+12\n",
       "11        mnth_7  3.422621e+12\n",
       "6         mnth_2  3.422621e+12\n",
       "5         mnth_1  3.422621e+12\n",
       "15       mnth_11  3.422621e+12\n",
       "16       mnth_12  3.422621e+12\n",
       "22     weekday_5  1.549163e+12\n",
       "21     weekday_4  1.549163e+12\n",
       "20     weekday_3  1.549163e+12\n",
       "19     weekday_2  1.549163e+12\n",
       "18     weekday_1  1.549163e+12\n",
       "23     weekday_6  8.029111e+11\n",
       "17     weekday_0  8.029111e+11\n",
       "27          temp  3.176716e-01\n",
       "0             yr  2.317455e-01\n",
       "28         atemp  1.018338e-01\n",
       "30     windspeed -1.380822e-01\n",
       "29           hum -1.568790e-01\n",
       "32    workingday -7.462522e+11\n",
       "31       holiday -7.462522e+11\n",
       "4       season_4 -3.771365e+12\n",
       "2       season_2 -3.771365e+12\n",
       "3       season_3 -3.771365e+12\n",
       "1       season_1 -3.771365e+12\n",
       "24  weathersit_1 -3.978377e+12\n",
       "25  weathersit_2 -3.978377e+12\n",
       "26  weathersit_3 -3.978377e+12"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "# 1.使用默认配置最小二乘线性回归学习器实例\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 2.用训练数据训练模型参数\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "# 3. 用训练好的模型对测试集进行预测\n",
    "y_test_pred_lr = lr.predict(X_test)\n",
    "y_train_pred_lr = lr.predict(X_train)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef\":list((lr.coef_.T))})\n",
    "fs.sort_values(by=['coef'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.1用RMSE指标评价最小二乘线性回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE score of LinearRegression on test is 0.09332952081939526\n",
      "The RMSE score of LinearRegression on train is 0.08575908006961636\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error #均方误差\n",
    "\n",
    "# 使用RMSE评价模型在测试集和训练集上的性能，并输出评估结果\n",
    "#测试集\n",
    "print ('The RMSE score of LinearRegression on test is', mean_squared_error(y_test, y_test_pred_lr)**0.5)\n",
    "#训练集\n",
    "print ('The RMSE score of LinearRegression on train is', mean_squared_error(y_train, y_train_pred_lr)**0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.2 预测值和真实值plot图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.scatter(y_test_pred_lr,y_test)      #画出散点图,横轴是预测值，纵轴是真实值\n",
    "#直线的起点为(y.min(),y.min()),终点是(y.max(),y.max())\n",
    "plt.plot([y_test_pred_lr.min(), y_test_pred_lr.max()], [y_test.min(), y_test.max()], 'b',lw=5) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.3 预测残差的分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc508715780>"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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8IIzlO4ohg0bxtixY2lpaenxPgxpSSrAihUr2H333Rk3bhwRjfryMw2UzGTdunWsWLGC8ePH93g/DndLUgFeeOEF9tprLwN6BxER7LXXXr0eGTGkJakQBvSOpRHvpyEtSVKhPCctSQVqb+///Q0ZMoQjjjiCDRs2MH78eL75zW+yxx57bPex3vve9/LhD3+YQw899BXrr732WhYtWsRVV1213fsEGD58OOvXr69r2ylTpnDFFVfQ1ta2ed2iRYu47rrruPLKK3t0/IFgT1qSBMCuu+7KkiVLeOCBBxg1ahRXX311j/bz1a9+dauALkFbW1ufB/TGjRsbuj9DWpK0lcmTJ7Ny5crNy5dffjlHH300Rx55JJ/+9KcBeO6555g2bRoTJkzg8MMPZ+7cuUCtF7tpCuhvfOMbHHTQQZx00kncc889m/d37rnnMm/evM3Lw4cPB2D9+vVMnTqVo446iiOOOIL58+dvVduqVas48cQTmThxIocffjg//OEP62rTwoULOfXUUwFob2/nvPPOY8qUKRxwwAGvCO/rr7+eY445hokTJ/K+971vc/BecMEFtLW1cdhhh21+DaA25fWll17KG9/4Rm655Za6aqmXw92SpFfYuHEjCxYsYObMmQDcfvvtLFu2jPvuu4/M5LTTTuOuu+5i7dq17LvvvnznO98B4Omnn37FflatWsWnP/1pFi9ezMiRI3nTm97EpEmTtnnsYcOGceuttzJixAiefPJJjjvuOE477bRXXIR14403cvLJJ/PJT36SjRs38vzzz/eonQ8//DB33nknzz77LAcffDAXXHABy5cvZ+7cudxzzz20tLRw4YUXcsMNN3DOOefw+c9/nlGjRrFx40amTp3K/fffz5FHHrm57rvvvrtHdWyLIS1JAuCPf/wjEydO5NFHH+UNb3gDb33rW4FaSN9+++2bA3b9+vUsW7aME044gY985CN8/OMf59RTT+WEE054xf7uvfdepkyZQmtr7QufzjjjDH71q19ts4bM5BOf+AR33XUXO+20EytXrmT16tW86lWv2rzN0UcfzXnnncdLL73E6aefzsSJE3vU3mnTprHLLruwyy67MHr0aFavXs2CBQtYvHgxRx999ObXZPTo0QDcfPPNzJ49mw0bNrBq1SoeeuihzSF9xhln9KiG7jjcLUkC/nxO+rHHHuPFF1/cfE46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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#在训练集上观察预测残差的分布，看是否符合模型假设：噪声为0均值的高斯噪声\n",
    "f, ax = plt.subplots(figsize=(7, 5)) \n",
    "f.tight_layout() \n",
    "ax.hist(y_train - y_train_pred_lr, bins=40, label='Residuals Linear', color='b', alpha=.5); \n",
    "ax.set_title(\"Histogram of Residuals\") \n",
    "ax.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结论：从特征系数可以看出，特征系数均很大，说明租车用户数cnt受所有特征变量影响很明显。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2）用训练数据训练岭回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>yr</td>\n",
       "      <td>0.232385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>temp</td>\n",
       "      <td>0.206065</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>atemp</td>\n",
       "      <td>0.177930</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>0.105384</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>season_4</td>\n",
       "      <td>0.090386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>0.088549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>0.044535</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>0.040284</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>0.038376</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>0.029552</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>0.026098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>0.024690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>workingday</td>\n",
       "      <td>0.024348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>0.019057</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>season_2</td>\n",
       "      <td>0.011460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>0.009518</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>0.007005</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>0.006973</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>0.001365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-0.003828</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>season_3</td>\n",
       "      <td>-0.009499</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-0.022139</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-0.023626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>-0.026913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-0.028307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-0.036117</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-0.046737</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>-0.063298</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>-0.068807</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-0.092348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-0.124526</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>hum</td>\n",
       "      <td>-0.130080</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>-0.149919</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns      coef\n",
       "0             yr  0.232385\n",
       "27          temp  0.206065\n",
       "28         atemp  0.177930\n",
       "24  weathersit_1  0.105384\n",
       "4       season_4  0.090386\n",
       "13        mnth_9  0.088549\n",
       "25  weathersit_2  0.044535\n",
       "10        mnth_6  0.040284\n",
       "9         mnth_5  0.038376\n",
       "12        mnth_8  0.029552\n",
       "23     weekday_6  0.026098\n",
       "14       mnth_10  0.024690\n",
       "32    workingday  0.024348\n",
       "7         mnth_3  0.019057\n",
       "2       season_2  0.011460\n",
       "22     weekday_5  0.009518\n",
       "20     weekday_3  0.007005\n",
       "21     weekday_4  0.006973\n",
       "8         mnth_4  0.001365\n",
       "19     weekday_2 -0.003828\n",
       "3       season_3 -0.009499\n",
       "17     weekday_0 -0.022139\n",
       "18     weekday_1 -0.023626\n",
       "11        mnth_7 -0.026913\n",
       "31       holiday -0.028307\n",
       "6         mnth_2 -0.036117\n",
       "5         mnth_1 -0.046737\n",
       "15       mnth_11 -0.063298\n",
       "16       mnth_12 -0.068807\n",
       "1       season_1 -0.092348\n",
       "30     windspeed -0.124526\n",
       "29           hum -0.130080\n",
       "26  weathersit_3 -0.149919"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import Ridge\n",
    "\n",
    "#1. 设置超参数（正则参数）\n",
    "alpha=1 #此处0到1之间拟合最好\n",
    "\n",
    "#2. 生成一个RidgeCV实例\n",
    "ridge=Ridge(alpha)\n",
    "\n",
    "#3. 模型训练\n",
    "ridge.fit(X_train, y_train)    \n",
    "\n",
    "#4. 预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef\":list((ridge.coef_.T))})\n",
    "fs.sort_values(by=['coef'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.1用RMSE指标评价岭回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE score of Ridge on test is 0.09335218835687474\n",
      "The RMSE score of Ridge on train is 0.08585974479088024\n"
     ]
    }
   ],
   "source": [
    "# 评估，使用RMSE评价模型在测试集和训练集上的性能\n",
    "#测试集\n",
    "print ('The RMSE score of Ridge on test is', mean_squared_error(y_test, y_test_pred_ridge)**0.5)\n",
    "#训练集\n",
    "print ('The RMSE score of Ridge on train is', mean_squared_error(y_train, y_train_pred_ridge)**0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3XucjdX+wPHPmj2DIYxQMhGVW6IwUqkOyu1UzK900+UoIrl0Sk6ccyo5lSmVELkkne6IM6lcEropMiIiTiKX4ZTKlMbEXNbvj2dm7NnzrL2fPbPv+/t+vbyO2XvtZ695cr577e9a67uU1hohhBCxJSHcHRBCCBF4EtyFECIGSXAXQogYJMFdCCFikAR3IYSIQRLchRAiBklwF0KIGCTBXQghYpDP4K6UelEp9aNS6mvD80opNUUptVMptVkp1T7w3RRCCOGPRAdtXgKeA142PN8baFb8pxPwfPH/elWvXj3dpEkTR50UQghh2bBhw09a6/q+2vkM7lrrj5VSTbw06Qu8rK06BmuVUilKqdO01ge9XbdJkyZkZWX5enshhBBulFJ7nLQLRM49Fdjn9vP+4seEEEKESSCCu7J5zLYamVJqsFIqSymVdejQoQC8tRBCCDuBCO77gUZuP58OHLBrqLWepbVO01qn1a/vM2UkhBCiggIR3BcDtxWvmrkQ+NVXvl0IIURw+ZxQVUq9AXQB6iml9gMPA0kAWusZwBLgz8BO4Chwe7A6K4QQwhknq2Vu8vG8BoYFrEdCCCEqTXaoCiFEDJLgLoQQwXbsGBw+HNK3dLJDVQghYlbmxmwmLt/BgZw8GqYkM7pnC9LbBXCrzuefw6BB0LIlLFwYuOv6ICN3IUTcytyYzdhFW8jOyUMD2Tl5jF20hcyN2ZW/+O+/w8iR0LkzbNsGixZZf0JEgrsQIm5NXL6DvPzCMo/l5RcycfmOyl142TJo3RqmTgXttqdz2LCQpWckuAsh4taBnDy/Hvfpp5/g1luhd2/Yu7f88//7HzzwQMWu7ScJ7kKIuNUwJdmvx420htdfh1at4NVXze3S0qzRewhIcBdCxK3RPVuQnOQq81hykovRPVs4v8i+fXDVVXDzzdbI3U5yMjz1lDW5et55leixc7JaRggRt0pWxVRotUxRETz/PIwZY02emlx+OcycCWedFaBeOyPBXQgR19Lbpfq/9HH7dmt545o15jYpKfDMMzBgACi74rnBJWkZIYRw6vhxePRRK7XiLbD36wfffAO33x6WwA4ychdCCGe++MIarW/ZYm5z2mkwfTqkp4euXwYychdCCG9yc+G+++Cii7wH9sGDrc1KERDYQUbuQghhtmIFDBkCu3eb25x9NsyeDV26hKxbTsjIXQghPP3yizUR2qOHObC7XNaGpM2bIy6wg4zchRBxyFgsTGtYsABGjIAffzRfoF07eOEFaN8+dJ32kwR3IURcKAno2Tl5KKCk4ktJsbBqPx7kvAn/4LSP3jdfpFo1GDcORo2CxMgOn5HdOyGECICS6o8lRcLcSnmhdBH/t34pnSfOpeaxo+aLdOkCs2ZBs2ZB7WugSHAXQsQ8u+qPAE1/ySZj2VQ67fva+Noj1WpQc8okGDgQEqJnmlKCuxAi5nlWeUwsLGDwF4u4Z80bVC3MN75uebMLeaj7UNbdeVuwuxhwEtyFEDGvYUoy2cUB/tz/7eSJpVNo/eMuY/tDNVJ4sPtQljW/mNQ61UPVzYCS4C6EiHmje7bgkXnrGbL6Fe5cn4lLFxnbzmvTnce6DeS3aieVVogM+lF8QSDBXQgRs0qC8hlfreXt95+j8S8HjW2zTz6N3Y9NYkpOfY7k5JFaHMSBMpOxJatrgIgO8BLchRBBEazRrtPrZm7M5vHXP+e+92dz42bz8sZClcCctL48c+nN1M2pU+56nTNWGY/ik+AuhAipcKcRPJceBmq06891v3j6Bd7NnMwpueYzS7+p34QHeo9k82nNjdczHbmXnZNH54xVZe5tuO+7OwnuQsSYYAVWf3g7eNrfPrgHzASlKHQ/cNruugcPwvDhPL5okfGax12JPNu5P7MuuIYCV9kw6Hk998lYT+73FiIrfRM9izaFEI54C6yhEqiDp0s+qLJz8tBQLrCXyM7Jo/OElYzpPZIjZzYDL4H9qybn8vH8D3i791/KBXa7ftodxeeu5N5Gwn13J8FdiBgTqMBaGYE6eNq0+chTk8MHmDjjPjKWTaXmH7m2bY5USeaR3sPY/dYSrrjmT6wZ041UQ38SlCJzYzZgjbonXNPG2BasexsJ992dBHchYkygAmtlBOTgaXwHRldRIUPWLWTZi8O5eO9mY7uVZ3Xk1vvmct5jY0nv0MhrP8H6hjB20ZYyAd7bh0HDlOSIuO/uJLgLEWMCFVgrw320q4DUlGQmXNPG79yzKTC6lOKcH3bx3uujGfvhXKoVHLe/QP368OabXP7tOjIn3FDu/Uv66bI5Cs8upeLt3kbCfXcnE6pCxJiSABbuVRsVOnjaw+ieLcpMUgLUVoXM/2EFLV55HgrNKZul7brTe8UbULeuz37eO2+T7XOe3xyc3Ntw3/cSEtyFiEGBCKyRwDOY9j78LU8sn0rNPebSAftrncK4K0dy1egBPgN7CdOKGLtvDt7ubSTddwnuQoiIlt4ulfQzT7JOPZo109iuCMVLHa7m9asHM7zP+X6tPbf7hhDOlEogSHAXQkS2xYth6FA4cMDYZEe9xozpNZIfW7djzZhupY87XfMfKamsQHIU3JVSvYDJgAt4QWud4fF8Y+DfQEpxmzFa6yUB7qsQIgKEbBfmDz/AyJEwf76xyfGERJ67+Aaev7Af+a4klEdqxZ/NVJGUUgkEn8FdKeUCpgHdgf3AeqXUYq31Nrdm/wTma62fV0qdAywBmgShv0KIMAr07lfbD4rzG8K//w333QeHzaUDNjRsyQO9R7KzXuPSxzxz5JG29jyUnIzcLwB2aq13ASil3gT6Au7BXQO1iv9eGzB/fxJCRK1AlxXw/KB4bs4KLt4wl1PWfmx+YY0abB72ALcltifXrSt2OXJ/JkpjjZPgngrsc/t5P9DJo8044H2l1AigBnCF3YWUUoOBwQCNGze2ayKEiGBOR8JOUjfuHxQJRYXcvuEdRn3yCtXzj5k70Ls3zJhB28aNeSxME6WRVBzMGyfBvfzq/rLnywLcBLyktX5aKXUR8IpS6lyty1bE11rPAmYBpKWl2ReJEEJELCcjYaepm5IPhBaHvueJpVM4/+B/zW9cty5Mngz9+0PxhiMnOfJAT5RGQlE2p5wE9/1AI7efT6d82mUg0AtAa/25UqoaUA/4MRCdFEJEBicjYaepmzNOcnHNkpcYuu4tkoq81I/p3x+efdbabYr/I2fTh0BFRuCBTEsFm5Pgvh5oppRqCmQDNwL9PdrsBS4HXlJKtQKqAYcC2VEhRPg5GQk7St2sWcM7c0ZQ8/ud5jdr1Aiefx6uvLL0oUCNnCt6nWiaoPUZ3LXWBUqp4cByrGWOL2qttyqlxgNZWuvFwChgtlLqXqyUzQCtDbU5hRBRzVc6xGvq5sgRGDsWpk+npilEKAXDhsHjj0PNmmWeCtTIuaLXiaYJWkfr3IvXrC/xeOwht79vAzoHtmtCiGhkSt08VX0/nPMX2L/f/OKWLWHOHLj4YtunvR2a4Y+KjsCjaSer7FAVQgSUZ+rmnMRjzNjwCo2WZhpfk5/g4tUuN1H38Ufo0+lMYzuXzUlMJY/7o6Ij8GjaySrBXYg4F4ylfentUq3NSK+9Bn/9K/z8s7HtptOa80Dvkeyo34Tkd/9LUZWqxvc3ncRketxTye+anZOHouyyP6cj8GjZySrBXYg4FrSlfXv2WPVgli41NslLqsrES2/jpQ5XUZRg1UH3lfdONYy4vZ2SVMLzd9VQGuBTI3gEXlFyWIcQcSzg534WFsLUqdC6tdfA/nGTdnS/YxovduxbGthLeMt7V+ZADLvftSSwrxnTLaYCO8jIXYi4Zgqk2Tl5NB3znn9pmm3bYNAg+PxzY5Ocaifxr253svDcbqWbkTx5y3tXJucdTcsYA0GCuxBxzDSxCNao1lGa5vhxmDABHnsM8vON7/VOy0t55IrB/FSjDgApyUkcKyjye+VJRXPe0bSMMRAkuAsRx+yW9nnKyy/kkXe22o+W1661Rutbt5pff0oDRnUZwpKmHUsfS05yMa5PayB0K0+iaRljIKhw7TVKS0vTWVlZYXlvIcQJ7qtlnEaDuvo48/e9x1lvvgjeYshdd0FGBpm7fo+I5YPRUvTLG6XUBq11ms92EtyFECU6Z6zyuSHosl0beHz5NE7/zUvpqObNYfZsuOyyAPfQu1gI3r44De6yWkYIUcpuNUqJlLzfePrdp3l5wcPmwO5yWeUFvvoqLIF97KItZBd/AymZL8jcmB3SfkQKybkLIUrZrUbJ/SOfS79cycMrZ1Hv6K/mF7dvb5UOOP/8EPW2rEis2BjObxIS3IUQZZRZjbJ/P//rfzsNPvnA/ILkZBg/3tqJmhi+kBJpSx3DXftd0jJCiPKKimD6dDjnHO+BvVs32LIF7r8/rIEdzEsaw7XUMeAbxPwkwV0IUdb27fCnP1lld48csW9Tuza88AJ88AGcdVZo+2dQmd2rwRDubxKSlhERLRZXP0Ts75SfD08+aaVYjh83t7v2WqvEwGmnha5vDkRaxcZwb5qS4C4iVrhzlsEQsb9TVhYMHAibN5vbNGhgpWr+7/9C1y8/RVLFxnBvmpK0jIhY4c5ZBkPE/U65uVa+vFMn74F90CD45ptKB/bMjdl0zlhF0zHv0TljVUwvU0xvl8qEa9qQmpKMwipQNuGaNrJaRohw5yw9BSKdElG/08qVcOedsHu3scn3KafxdL9RTJ09qtJvF7HfWoIonN8kZOQuIlYkrX4I1AYZU99rJyeFbkR7+DDccQdccYUxsBeoBGZ0upZed0zl3botA/K2EfetJcZJcBcRK5JWPwQqMNn9TkkJitzjBcHfWak1vPUWtGoFc+cam2095Uz63vYMGV1u54+kagH7MI2oby1xQNIyImJF0uqHQAUmu9/p6PECDh8tWyo34DsrDxyAu++Gt982NimsUpVnO/fn+Q59KXBZoSGQH6bhXj0SbyS4i4gWKasfAhmYPH+npmPes20XkBFtUZG1Hn30aPjtN3O7yy7DNXs2Z+XW4NQgfZh2bVmf19burdC5pcJ/kpYRwoFgpoiCNrfw7bfWDtIhQ8yBvVYtmDkTVq+G5s1Jb5fKmjHdmHSDVR/m3nmbAjIHkLkxm4UbsssEdgVc2yEyPrxjkQR3IRwI5rK2gH9w5OfDE09A27bw0Ufmdn37WkfjDR4MCSdCQTCqK5rOL129/VCFrym8k7SMEA4FK0UU0LmFL7+01qRv3Ghuc8op8Nxz0K+f7TmmwaiuKJOpoSfBXYgIUOkPjrw8GDcOnn4aCs1H5jFggNXm5JONTYIRiGUyNfQkLSNElPt09gL2NWpm1YUxBfamTWHFCmsJpJfADsGZA4ikZa3xQkbuQoRIwAuG5eTw/R3DuOQ/r5vbJCRYddbHj4caNRxdNhg1USqTeorYQmsRToK7ECEQ8K33//kPDBtGk4MHzW3atLGWQV5wgV+XDtb+goqknuKxZEGgSHAXIgQqM0npPnI915XHjHVzSV25xNj+mCuRqRffSLOnxtP3gqYV6m+k7C+IxKPzooUEdyFCoKKTlKUj1+MFXLdlBf9cNYfax3KN7dennsOYXiP4rl4jkt/ZgU6qEtVBUFbZVJwEdyFCwJ/VIu4j9QSlaHj4IBOWTeWSPV8Zr/97lWQy/jSA19r1RitrnUQsjHBllU3FSXAXIgTsJimTEhRHjxfQdMx7pXltoLSdq6iQ27PeZtQnr5FccMx47ZVndeSfPe7mYK365Z6L9hFuuA+8iGaOgrtSqhcwGXABL2itM2zaXA+Mw9p49pXWun8A+ylEVPOcpKydnESuW8GwkonCakkJ5OUX0urHXWQsncp5//vWfNF69Rh50e0sbnWZ7WYkiP4RbiQVj4s2SmvtvYFSLuC/QHdgP7AeuElrvc2tTTNgPtBNa31YKXWK1vpHb9dNS0vTWVlZle2/EFGpc8Yq23RD1YLjjPjsTYasW0hSkXkz0r4/X8OWUeMY9n7ZQlzukpNcIT35R4SGUmqD1jrNVzsnI/cLgJ1a613FF34T6Atsc2tzJzBNa30YwFdgFyLe2QX2jvu+JmPZc5z1y37j6w7WPoV/XTWSpaefT8KKfcbAnpKcxLg+rSWwxzEnwT0V2Of2836gk0eb5gBKqTVYqZtxWutlAemhEDEmc2M2CkoD80nHjjLmw7ncsmmp8TVFKHbfdDvXN7qKn1UVAAq9fOve9HCPAPZYRCMnwd0umef5ryoRaAZ0AU4HPlFKnau1zilzIaUGA4MBGjdu7HdnhYgFE5fvKP0/0OU71/Ho8umc9vvPxvb/rduYMb1H8EPr9vzsYII0Ncrz7CIwnAT3/UAjt59PBw7YtFmrtc4HdiuldmAF+/XujbTWs4BZYOXcK9ppIaLZgZw86ubmMO6DmVy9/RNju+MJiUy/6DqmX3g99evVcrTyRVaSiBJOCoetB5oppZoqpaoANwKLPdpkAl0BlFL1sNI0uwLZUSFigtbcsesTPnhhqNfA/mXDFlw5YDLPXnIzruRqjO7ZwrjyxaVUwGvMi+jnc+SutS5QSg0HlmPl01/UWm9VSo0HsrTWi4uf66GU2gYUAqO11ubvmULECfcNSe31r0z/eBYPrjUfoJGbVI1pV9zOO5f8H/t/O06qx9I/uzXfngFdCm0JcLAUMlhkKaSIdSWlA44dO86ADe9y/ycvUz3fvBnpo6bt+UfPYWTXPpXdGVcar+ktcHsW2gJZEhlrArkUUghRAROX76DRge94YulU2h3cYWz3S3Itxl9+J5nndAGlvE6I+iroJYW2RAkJ7kIEw7FjXP/OCwxdu4AqRQXGZu+27sLDXQfxc40UwBpld21Zn84ZqyqUVgl2oS1J+UQPCe5CBNpnn8GgQdzzzTfmNqefDs8/T0FqO6ot34EqDpZdW9Zn4YZsr/XLvQXYYBbaktrq0UWO2RMiUI4cgREj4JJLwEtgn9fxatr0e4bOX1cHYM2YbuzOuJI1Y7qxevshY1oFTgTY7Jw8NCcCbObGbCC4x9l5S/mIyCMjdyECYelSuOsu2LvX2GR33dMZ++eRrG14DgBHbEa+vtIqvnLqwSy0JbXVo4sEdyEq46efrDNKX3vN2CQ/wcWu24dx1xm92Z3rfbLTV1rFSYAN1ilKUls9ukhaRoiK0Bpefx1atfIa2Ded1oyr//Isd5zdl+9z7as8ugdmX2kVUyANRYANZspHBJ6M3IWw4XVVyN69MHQoLDGfY5qXWJWnLr2FuWl9KEpwQU4eLqVsi325B2ZfaZVwHl4htdWjiwR3ERf8WcJnXBVSVET652/D2LHw++/G9/rkjPP5e6/h7EtpUOZxu8DuHpg9+zjphvPL9THcATZSDs4WvskOVRHz/N21aXeQxlk/7WPSB8/Rds9W8xvVqcOX9zzIzfktySsoMjZzKUWR1mUCs10fS8oCe5YgEPFNdqgKUczfXZvuOfCkwnzuWvsWwz+fR9VC82YkrrsOpkyhfYMGTCgegdtNPgIUaV2uvIBdH0uGXbKeXFSEBHcRczzTG6Yga1p5UvKa8w/sIGPpFFr+tMf8Zg0bwvTp0Ldv6UMlAXjU/K9sUzEp1ZMc96WElBAQ/pLgLqKaZyC32+HpfuqRO9MKkzGXNeKXe//GrV+8TYLxIDtg8GB48kmoXbtcn8Yu2mI8Ken3PwrI3JhdJlB7+xAqIevJhT9kKaSIWna7NV9bu9c2veF5nJhxhcn773P1zT34yxeZ5sDerBl8+CHMnFkusIN9isVdfpEut6vTbpmhJ1lPLvwhwV1ELW95ak8lE5Mlh1pc2yGVict30HTMe3TOWMV7q7+GAQOgZ0/4/nvbaxQkJDD9wn50vXUymbXONvbLyQjbs016u1QmXNOGlOTyKRuQ9eTCf5KWEVHLnzRFakoya8Z0AzxWz2hNu8+X0+nRWZCbY3z91gZn87deI9h66lmQW+R1grN2chI5efle+2MahR+zWWWTkpzEuD6tJd8u/CLBXUQtU57aM8fuOeotGfE3+O0n/rViOt13fmF8j8KqVZnR9TaeaXMVhQkn0iamCc7MjdnkHveyqsamP5798lSjaqIEduE3Ce4iapl2a17bIZXV2w+VBv68/EL+Om8Tf523idSUZA4czuXmTcsY8+Fcah43j/4/b9yGSdeNZn3iybbpHrtvDhOX7yC/sHzrBGVVLPC26UgKc4lAkuAuopa33Zr/zNzCq2vLV2is+t23vLn8OTrt+9p43d+q1uCxrncwr20PUMpR2YASpkCsNcaj89yvJ4W5RKBIcBdRzbQd/o11+8r8nFhYwOAvFnHPmjeoWmjOhy9rfhEPXXEXP9asW/qYr7IB7kwBWmPtfPW20zScdWNCQU5xCi0J7iJmuAcP93Dc5uC3PLFsCuf8uNv42iN16vGPbkNYfPZFxjaqOJlvOpi6ZFeqaV29r52m4a4bE0xyilPoSW0ZERPsarNUy/+Dez99nUHrM3Fpc62XeW17MDf9btLanVkmV2/nWZtiXnbv7Y37yp14YVevB+LzXlSW1JYRccVzpclFe74iY9lUzsj5n/E1e1Ma8ECvEXx+xnlwDHas3cvNFzb2GuDtVsj42rTkKR4nSGWyOPQkuIuYUBIkav3xO39f/SI3bn7f2FYnJPBG536M73g9fyRVO/E48FpxgLebjHV/H1+PeeM+QRoveWiZLA49Ce4iJjRMSabNug8Yv2IGp+QeNjds2xY1Zw7/eOsH27y4BlZvP0SKYSOSXTByUhemhIIy9dsDlYfO3JjNuMVbS/tcp3oSD18dORufYn2yOBJJ+QER/Q4cYMH7E5mROcEc2KtWhccfh6wsSEvzOmI8kJPHuD6tHR8pZ1cXJsmlSEooW9FGATdf2LjMxKmpFLE/MjdmM3rBV2U+jA4fzWf0W1+RuTHbr2sFS0l5BfcSEKZ6+iIwZOQuIp4xdaE1zJkD999Pw19/NV/g0kth9mxocSIwj+7ZgnvnbTJWi/Rn5Yqpra/XByoPPXH5DvKLyv8m+YU6osoEyylOoSXBXUQ0U+qixt7ddJ/8EKxebXxtfo2TSHpqolWaN6Hsl9T0dqlk7fmF19buNZYq8CcYmdp6e32g8tDePgxkwjJ+SXAXEcVzlJ57rKBM6sJVVMhtn77FZRmvQ8Fx43VWnH0B0/rdR+ZdNxjbPJrehrQzTg7bhGbXlvVtJ267tqzv13W85fxlwjJ+SXAXEcNulO7unB928cTSybT54TvjNQ5VT2HcFUN4r+UlKO1Zxb28cKYKVm8/5NfjJqN7tmD0gq/KpWaSXEomLOOYBHcRcqYcumm9eNX8Y9zz2RsMXreIRC+bkd4693Ie7TaQnORagP+j1lAvSwxUzr2kj5G8WkaEngR3EVLelv/ZBbVOe7cwYdlUzjx8wHjNfbVP5e89h/FJ0/alj/m7zK4yyxIr+qEQyLXfMlkpPElwFyHlbfmfe7CreSyXsavn0v+rZcZrFSnF3A59ePrSWzha5URAdClVuszOaeD11i9vQbMyHwqy9lsEk6N17kqpXkqpHUqpnUqpMV7a9VNKaaWUz7oHIj55S0WUrBfv/u1aVrww1Gtg/+7Upnzy0ts81euuMoE9OcnF09efVxrYPc9YHbtoi+3a74qmSCqzVl3Wfotg8jlyV0q5gGlAd2A/sF4ptVhrvc2jXU1gJLAuGB0V0cdu1OwtFZHeMJGO66aRuuJd4zWPuRJ57qIbmHlhP/5729VM8DIy92c0XtEUSWXz5pJOEcHiJC1zAbBTa70LQCn1JtAX2ObR7l/Ak8D9Ae2hiEqmdMW1HVJZuCG7bCoiMYGpf2yCVv1IPWwuHZCV2ooxvUaws15jUouDrrfg6E/grWiKRGqmiEjlJC2TCriffLC/+LFSSql2QCOttXnIJeKKadS8evuhMqmIjkWH+eiDCbR/ZBQYAntulWQeumII1938BDvrNXaclzYFWLvHK5oisSs9IHlzEQmcjNztFguXLqhVSiUAk4ABPi+k1GBgMEDjxo2d9VBEJW+j5vR2qaS3bQCTJ8ODD8LRo+YL9e7Np8PHsXLz75CTR2pKMl1b1mfi8h3cO2+T10lSf0fjFUmRxPIBGyK6+TysQyl1ETBOa92z+OexAFrrCcU/1wa+A34vfkkD4Begj9baeBqHHNYR27wezvDnejBoEKxfb75AvXpW8L/ppuIjkCx2B2MkJ7mMq2O6tqzP6u2HJPCKmBHIwzrWA82UUk2BbOBGoH/Jk1rrX4F6bm/8IXC/t8AuYp/dqLm2KuTF7xZDh2lQUGB+8c03w6RJUL/8Nnxfq1M88/wLN2TLChQRl3wGd611gVJqOLAccAEvaq23KqXGA1la68XB7qSIPp7pil45O3ly+XPU/H6n+UWNGsHMmdC7d7mn3M8otXMgJ6/Ca9WFiEWONjFprZcASzwee8jQtkvluyViQXq7VNLPqgljx8LM6eaGSsHw4fDYY1CzZrmnnZxR2jAlWY5yE8KNHNYhgue996B1a5juJbC3agWffgpTptgGdvB9RmnJJKk/q2OEiHVSfkAE3o8/wj33wJtvmtskJbF9wDDuatyTPYsP0/DjVcbJTm8j71SPSVK7ydauLevTOWOVTKqKuCLBXQSO1vDqq3DvvfDzz+Z2nTqxctRjDN+cT97vvmuymDYKpaYks2ZMt9Kf7ZYldm1Zv8ymqcqcUypENJHgHqFCXX620v3ZsweGDIHly80XqV7dyquPGMFDEz/yOvnp/n61k5NIcinyC08s2zWtV/dcq945Y5VMsoq4JME9Atlt3b933iay9vzCo+ltIqI/paPftg1g2jT4+98hN9d8kR49rJUwTZoA3jc5eb5fTl4+SQmKOtWTyDma79eHnUyyinglwT0C2U0gauC1tXtJO+PkkI84TUsM33p5OelrZ8PateYXn3yytWb91lvLbEbyVpPF7v1fr7SYAAARn0lEQVTyizTVqySy8aEefvVdar+IeCXBPQKZRpUawpJO8OxPlYJ87l47n7s/XwBF5s1I+3v04a60W9m6LZna41egFKUjb89cOJxItdw7b5OjfjghNdNFvJKlkBHI26gyHOkE9/60z/6Gd1+6h7+ueYMqpsCemsraSXPpfsFQvi5MRmOlVg4fzS+tq75wQzbXdki1LdQVyCWNUjNdxCsZuUegktGrXdWfcKQTRvdswb/e/ILhK+fylw3vkmDbs2JDh8KECYx6fgN5+eYPopIKke6rXdzfL5CjbamZLuKRBPcIlN4ulaw9v/Da2r1lwmi40gnpP2yhx8sjqP6/8icYlWreHF54AS69FHD2DcPURiotClF5EtwrIBTLFB9Nb0PaGSeHN8D99JO1Zv3VV6luapOYCH/7m1W6t1q10odNE5nuvH0LkdG2EJUjwd1PlTkQ2V9hC3BaW7tL77kHDh0yt+vQAebMgfPOK/eUXWrFnUxqChFcMqHqp8ociBwV9u2Dq6+G/v2NgT0vsSpf3/ugtQTSJrBD+YnMlOQk6lRPkklNIUJERu5+itlNMUVFMGMGjBkDR44Ym605oy1je46g8JQzWZPo/Z9PNKRWIm0nsBCBIsHdoZIgYFonEtWbYrZvt05GWrPG2OTXqjV4tNtAFrTpDkqhov3DjNCm2IQINUnLOFASBEwThFGbPz5+HB591EqteAnsS5pfzBWDnmdB2x6lu0yj+sOsWMyn2ERck5G7A97qiXuWnI0a69fDwIGwZYu5zWmnsW7UeEblnB6TOzxjNsUmBBLcHTH9n12B7SacUKlQvjg311q2OHmylWc3ufNOePJJOqWkMCFG89JSd0bEMgnuDkRiEKhQvviDD2DwYNi923zhs8+GWbOga9fiD48vS4P6pBvOj4mgXiLe6s7I5HF8kZy7A6N7tiA5yVXmsXAHASf54syN2XTOWMX597zJe2m9oHt3Y2AvcrmszUibN5cG9pJ5hpJ6MGMXbSFzo5ddqlEmnurOxMN/T1GWjNwdiMTt8L7yxZkbsxm7cDNdv/6YRz6YQf3cHOO1tp5yJk9dP5q5T9xV+pi3D49YCn7RsFwzEOLlv6c4QYK7Q5EWBHyliubO/5TJC5+lx7fmWut/JFbh2c79eaFjOoWusv8UZLIxtsh/z/gjaZkoZUwVdW8Gs2bxyjN3eA3saxudS6/bpzLjwn4UuBLLzR8EsuyuCD/57xl/JLhHKbt88ZQONUgfdSsMGUKt40dtX3ekanUe+vNIbrrpcb4/2fomYjd/EInzDKLi5L9n/JG0TBQrTRXl58PTT8ON4+DYMWP7D1pcRMGUqbSv34CVPuYPInGeQVSc/PeMP0prLwcvBFFaWprOysoKy3vHlC+/tDYjbbI/mg7gUI0Unu07ko6j7iS9/ekh7JwQItCUUhu01mm+2snIPVodPQrjxsEzz0Ch/e5ZAG6/nfpPPcVjJ5/s9XKyBlqI2CLBPRqtXm3tIP3uO3Obpk2tzUhXXOHzclJAS4jYI8E9muTkwOjR1nF2JgkJ8Ne/wvjxUKOGo8ua1kCPmv8VEJgAb/pmIN8YhAgOCe7R4j//gWHD4OBBc5u2ba3A37GjX5c2rXUu1JrRCyof4E3fDLL2/MLCDdnyjUGIIJDgHukOHoThw2HRInObKlXgoYes8gFJSX6/hbfzTvOLNOMWb/Ur2HqOxo8eL7D9ZvDGun0Uekzoy65JIQJDgnsYOEpFaA0vvgj332+lY0wuuQRmz4aWLSvcH1/nnebk5Tu+lt0o3cQzsJeQXZNCVJ5sYgoxRwWcvvvOmggdNMgY2H+vksymsY/DRx9VKrDDiQ1RgeCt9r0nV/HBH55k16QQlSfBPcQeeWeruZpjQQE89RS0aQOrVhmv8cFZHek+cDrDanWyJlADIL1dKnWq26d0TI/bcTrqTk5ycVOnRrJrUoggcRQZlFK9lFI7lFI7lVJjbJ6/Tym1TSm1WSm1Uil1RuC7Gv0yN2Zz+Kh9iqP2jq1w4YXWapg8+wD5U/XajLh6NIOufYiDteoHPH3x8NWtcSWUHU27EhQPX93a8TVMo+6U5KRypXUfTW8TNyV3hQg1nzl3pZQLmAZ0B/YD65VSi7XW29yabQTStNZHlVJDgSeBG4LR4WhmdzZn1YLjjFzzBkO+WOj1ZKSFrbvyr8vvJCe5VuljwUhfJACFHj/7w3QAxrg+rW2DdqRV2xQiVjiZUL0A2Km13gWglHoT6AuUBnet9Wq39muBWwLZSV+iZa2050j7gn1fM2HZVM76xXxgwsGUU3l/xMNk6KYVPjHI6f2ZuHwH+UVlJznzi7Rfq1ekhokQkcFJcE8F9rn9vB/o5KX9QGBpZTrlj2jaXVmy5LDmsVwe+PAlbtlkvk1FKF7qcDVPXXYrWp/EtR1SWb39kN8B05/7E6ia3zIaFyL8nAR3uyUNtmvYlFK3AGnAnwzPDwYGAzRu3NhhF72LphNmRvdswfsZs3lwyXOc9vvPxnY76jVmTK+RbEwtXgVTvCb86evP8/t38uf+ROJZsUKIinGSUt0PNHL7+XTggGcjpdQVwD+APlpr27qzWutZWus0rXVa/fr1K9LfcqLmhJkffiA94z6mz3/EGNiLEpOY1Lk/Vw2YfCKwFyvUukJnXvpzf6TmtxCxw0lwXw80U0o1VUpVAW4EFrs3UEq1A2ZiBfYfA99Ns4g/YUZr+Pe/oVUrmD/f3O7CC7lt+AwmX9KffJf90kPPA7Cd8Of+xNOB0ULEOp/BXWtdAAwHlgPfAPO11luVUuOVUn2Km00ETgIWKKU2KaUWGy4XcBE92ty9G3r1ggED4PBh+zY1asCUKfDpp6ypeqrPS/r7jcTf+5PeLpU1Y7qxO+NK1ozpJoFdiCjlqPyA1noJsMTjsYfc/u67rmyQROTqjMJCK2D/859W3XWTXr1gxgw4w9oW4K3GSwl/v5FE5P0RQgSdnMQUaFu2WGUDvvjC3KZuXXj2Wbj5ZnDbgu+5ssVTcpJL0iRCxDk5iamCKrxm/tgxeOwxmDDBKiNg0r+/FdhtJpQ9R9m1k5NQCnKO5suIWwjhFwnubiq8Zv6zz6zR+jffmNs0agTPPw9XXum1D7JGXAgRCFI4zI23NeG2jhyBESOssrumwK6UdcjG1q0+A7sQQgSKjNzd+LVmfskSuOsu2Lev/HMlWra0Tkbq3DlAPRRCCGdk5O7G0ZrwQ4esidArrzQH9sREePBB2LhRArsQIixk5M6JSVS7ZYila8K1htdfh3vugZ/NpQPo2BHmzLFqsgshRJjEfXD3tvxQAdd2SCX95AJrpL7USz206tXh0Udh5EhwuczthBAiBOI+uHs7Fk4VFVL3xVmwai7k5pov0r07zJwJTZsGqZdC+BYtpa9FaMR9cDdNop79016eWDqFDge2m19cpw5MmgS33VZmM5IQoRZNpa9FaMRccPd39OK55T+pMJ+ha99i2OfzqFroZTPS9ddbJQZO9V0PRohgi6bS1yI0Ymq1TMnoJTsnD82J0Yu3MrnuhbXOP7CDd1+6h/s+fc0Y2A/VqsvaSS/CvHkS2EXEiJrS1yJkYmrkXpHRS3q7VFxHc8n721j6ffYfEuzPIQHgtfN7kdHldgp+rsWEjdkyIhIRQw5aEZ5iauReodHL++9z9c09uP6zRcbAvqtOQ264aQL/6DmcI1VrVKiuuhDBFNGlr0VYRPXI3TO/Xjs5iZy8/HLtbEcvP/8M990HL79sfgOXi2kdr2HKxTdyLKlqmafk666IJFLaWXiK2uButzogyaVISlDkF50YgZcbvWht5ctHjrR2m5q0bw9z5vD6sl84Jl93RRSQonPCXdSmZezy6/mFmpOqJZqPidu/H/r0gZtuMgf2atXgySdh3To4/3y6tqxf7oRw+borhIh0UTtyN6VFco7ms/GhHmUfLCqyNhk98IBVydGka1eYNQvOPhuwvh0s3JBdJhNfumtVRkhCiAgWtSN3xwc/79gBXbrA3XebA3vt2lb1xpUrSwM72H870MDq7V7SOUIIEQGiNrj7XB2Qnw+PPw7nnQeffGK+0DXXWLXYBw4st8tU1g4LIaJV1KZlvK4OyMqygvXmzeYLNGgA06ZZwd2N+wqcBKUotDljViZThRCRLmqDO9isDjh6FO6/36r3UlRkfuGgQdakaZ06ZR72XIFjF9hlMlUIEQ2iOriXsXIlDB4Mu3aZ25x5JsyeDd262T5tqhDpUooirWXtsBAiakR/cD98GEaNgrlzzW0SEqw248ZZddcNTLn0Iq3ZnSHnnwohokf0BnetYeFCGD4cfvjB3O6886yTkTp08HnJYNfnkHrbQohQic7VMgcOWBOh111nDuxVq1qrZdavdxTYIbj1OSpSsVIIISoqOoP74MGQmWl+/rLLrJUyY8dCUpLjy6a3S2XCNW3MO1wrwVvFSiGECLToTMs89RSsWAHHj5d9vFYtaxXMnXdaefYKCFZ9DlkzL4QIpegcubdsCQ89VPaxPn1g2zYYMqTCgT2YHO+oFUKIAIi8KOjU3/4GbdvCKadYVR4zMyE1cicnpd62ECKUojMtA1YufcECqFvX+hPhpN62ECKUoje4AzRvHu4e+EXqbQshQiV60zJCCCGMHAV3pVQvpdQOpdROpdQYm+erKqXmFT+/TinVJNAdFUII4ZzP4K6UcgHTgN7AOcBNSqlzPJoNBA5rrc8GJgFPBLqjQgghnHMycr8A2Km13qW1Pg68CfT1aNMX+Hfx398CLldKeZ5OJ4QQIkScBPdUYJ/bz/uLH7Nto7UuAH4FIn8JixBCxCgnwd1uBO5Z6NxJG5RSg5VSWUqprEOmA6qFEEJUmpPgvh9o5Pbz6cABUxulVCJQG/jF80Ja61la6zStdVr9+vUr1mMhhBA+OQnu64FmSqmmSqkqwI3AYo82i4G/FP+9H7BKa5tjjIQQQoSEchKDlVJ/Bp4FXMCLWuvHlFLjgSyt9WKlVDXgFaAd1oj9Rq21lyORQCl1CNhT2V8gRtUDfgp3JyKY3B/v5P54F+335wyttc/Uh6PgLkJLKZWltU4Ldz8ildwf7+T+eBcv90d2qAohRAyS4C6EEDFIgntkmhXuDkQ4uT/eyf3xLi7uj+TchRAiBsnIXQghYpAE9zBxUGnzPqXUNqXUZqXUSqXUGeHoZ7j4uj9u7foppbRSKuZXP7hzcn+UUtcX/xvaqpR6PdR9DDcH/x9rrJRarZTaWPz/sz+Ho59Bo7WWPyH+g7Vf4DvgTKAK8BVwjkebrkD14r8PBeaFu9+RdH+K29UEPgbWAmnh7nck3R+gGbARqFP88ynh7ncE3qNZwNDiv58DfB/ufgfyj4zcw8NnpU2t9Wqt9dHiH9dilX2IF04qkQL8C3gS+COUnYsATu7PncA0rfVhAK31jyHuY7g5uUcaqFX899qUL6sS1SS4h4eTSpvuBgJLg9qjyOLz/iil2gGNtNbvhrJjEcLJv5/mQHOl1Bql1FqlVK+Q9S4yOLlH44BblFL7gSXAiNB0LTSi+wzV6OWoiiaAUuoWIA34U1B7FFm83h+lVALWoTADQtWhCOPk308iVmqmC9a3vk+UUudqrXOC3LdI4eQe3QS8pLV+Wil1EfBK8T0qCn73gk9G7uHhpNImSqkrgH8AfbTWx0LUt0jg6/7UBM4FPlRKfQ9cCCyOo0lVp5Va39Za52utdwM7sIJ9vHByjwYC8wG01p8D1bDqzsQECe7h4bPSZnHaYSZWYI+3fKnX+6O1/lVrXU9r3URr3QRrTqKP1jorPN0NOSeVWjOxJuVRStXDStN4LeYXY5zco73A5QBKqVZYwT1mDpqQ4B4G2jqtajiwHPgGmK+13qqUGq+U6lPcbCJwErBAKbVJKeX5DzNmObw/ccvh/VkO/KyU2gasBkZrrX8OT49Dz+E9GgXcqZT6CngDGKCLl87EAtmhKoQQMUhG7kIIEYMkuAshRAyS4C6EEDFIgrsQQsQgCe5CCBGDJLgLIUQMkuAuhBAxSIK7EELEoP8HM39OvS5X3cAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(y_test_pred_ridge,y_test)      #画出散点图,横轴是预测值，纵轴是真实值\n",
    "#直线的起点为(y.min(),y.min()),终点是(y.max(),y.max())\n",
    "plt.plot([y_test_pred_ridge.min(), y_test_pred_ridge.max()], [y_test.min(), y_test.max()], 'r',lw=5) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc50861cd30>"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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vZrnnvMKpQPF8OHDmTBhAi0tLd1ehyEtSQVYvXo1L33pS5k4cSIRjfryM/WVzGTDhg2sXr2aSZMmdXs97u6WpAI899xz7L333gb0ABER7L333j3eM2JIS1IhDOiBpRHvpyEtSVKhPCYtSSVqa+v19Q0ZMoTDDz+cTZs2MWnSJL7xjW8wevTo3d7Uueeey4c//GEOOeSQbeZfe+21LFmyhCuvvHK31wkwYsQINm7cWNey06dP54orrqC1tXXrvCVLlnDdddfx5S9/uVvb7wuOpCVJALzkJS9h2bJl3HfffYwZM4arrrqqW+u55pprdgjoErS2tjY9oDdv3tzQ9RnSkqQdTJs2jTVr1mydvvzyyznqqKM44ogjuOSSSwB4+umnmTlzJpMnT+awww5j/vz5QG0Uu+US0F//+tc5+OCDOeGEE7jrrru2ru/ss89mwYIFW6dHjBgBwMaNG5kxYwZHHnkkhx9+OAsXLtyhtrVr13L88cczZcoUDjvsMH70ox/V1dPixYs5+eSTAWhra+Occ85h+vTpHHjggduE9/XXX8/RRx/NlClTeO9737s1eC+44AJaW1s59NBDt74GULvk9aWXXsob3/hGbr755rpqqZe7uyVJ29i8eTOLFi1izpw5ANx6662sWLGCe+65h8zklFNO4Y477qC9vZ3999+f7373uwA88cQT26xn7dq1XHLJJSxdupRRo0bxpje9ialTp+5y28OHD+db3/oWI0eO5LHHHuOYY47hlFNO2eYkrG9+85uceOKJfPKTn2Tz5s0888wz3erzwQcf5Pbbb+epp57iNa95DRdccAErV65k/vz53HXXXbS0tHDhhRdyww03cNZZZ/G5z32OMWPGsHnzZmbMmMG9997LEUccsbXuO++8s1t17IohLUkC4Nlnn2XKlCk8/PDDvP71r+etb30rUAvpW2+9dWvAbty4kRUrVnDcccfxkY98hI9//OOcfPLJHHfccdus7+6772b69OmMHVv7wqfTTjuNX//617usITP5xCc+wR133MEee+zBmjVrWLduHfvtt9/WZY466ijOOeccXnjhBU499VSmTJnSrX5nzpzJsGHDGDZsGOPGjWPdunUsWrSIpUuXctRRR219TcaNGwfATTfdxNy5c9m0aRNr167lgQce2BrSp512Wrdq6Iq7uyVJwJ+PSa9atYrnn39+6zHp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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#在训练集上观察预测残差的分布，看是否符合模型假设：噪声为0均值的高斯噪声\n",
    "f, ax = plt.subplots(figsize=(7, 5)) \n",
    "f.tight_layout() \n",
    "ax.hist(y_train - y_train_pred_ridge, bins=40, label='Residuals Linear', color='r', alpha=.5); \n",
    "ax.set_title(\"Histogram of Residuals\") \n",
    "ax.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结论：从特征系数可以看出，租车用户数cnt受气温temp和体感温度atemp的影响很大，雨雪天气也会减少用户骑行量。年份yr与用户影响大，可能是因为公司随着时间累积的用户越来越多，年份越靠后用户基数越大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3）用训练数据训练Lasso模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>temp</td>\n",
       "      <td>0.310359</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>yr</td>\n",
       "      <td>0.232175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>atemp</td>\n",
       "      <td>0.098635</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>season_4</td>\n",
       "      <td>0.067359</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>0.066555</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>0.061779</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>0.025575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>0.023929</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>0.022012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>0.018832</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>workingday</td>\n",
       "      <td>0.005890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>0.001806</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>season_2</td>\n",
       "      <td>0.001052</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>0.000178</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>-0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>-0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-0.005587</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>season_3</td>\n",
       "      <td>-0.008031</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-0.015498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-0.025210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-0.026095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-0.034875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-0.041063</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>-0.047862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>-0.049361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>-0.051377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>hum</td>\n",
       "      <td>-0.115536</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-0.116440</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-0.117060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>-0.190628</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns      coef\n",
       "27          temp  0.310359\n",
       "0             yr  0.232175\n",
       "28         atemp  0.098635\n",
       "4       season_4  0.067359\n",
       "13        mnth_9  0.066555\n",
       "24  weathersit_1  0.061779\n",
       "14       mnth_10  0.025575\n",
       "9         mnth_5  0.023929\n",
       "7         mnth_3  0.022012\n",
       "10        mnth_6  0.018832\n",
       "32    workingday  0.005890\n",
       "22     weekday_5  0.001806\n",
       "2       season_2  0.001052\n",
       "23     weekday_6  0.000178\n",
       "8         mnth_4 -0.000000\n",
       "20     weekday_3  0.000000\n",
       "21     weekday_4  0.000000\n",
       "12        mnth_8  0.000000\n",
       "25  weathersit_2 -0.000000\n",
       "19     weekday_2 -0.005587\n",
       "3       season_3 -0.008031\n",
       "6         mnth_2 -0.015498\n",
       "5         mnth_1 -0.025210\n",
       "18     weekday_1 -0.026095\n",
       "31       holiday -0.034875\n",
       "17     weekday_0 -0.041063\n",
       "15       mnth_11 -0.047862\n",
       "11        mnth_7 -0.049361\n",
       "16       mnth_12 -0.051377\n",
       "29           hum -0.115536\n",
       "30     windspeed -0.116440\n",
       "1       season_1 -0.117060\n",
       "26  weathersit_3 -0.190628"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "\n",
    "#1. 设置超参数搜索范围\n",
    "#Lasso可以自动确定最大的alpha，所以另一种设置alpha的方式是设置最小的alpha值（eps） 和 超参数的数目（n_alphas），\n",
    "#然后LassoCV对最小值和最大值之间在log域上均匀取值n_alphas个\n",
    "# np.logspace(np.log10(alpha_max * eps), np.log10(alpha_max),num=n_alphas)[::-1]\n",
    "\n",
    "#1. 生成LassoCV实例（默认超参数搜索范围）\n",
    "lasso = LassoCV()  \n",
    "\n",
    "#3. 训练（内含CV）\n",
    "lasso.fit(X_train, y_train)  \n",
    "\n",
    "#4. 测试\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef\":list((lasso.coef_.T))})\n",
    "fs.sort_values(by=['coef'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE score of LassoCV on test is 0.09224251375801143\n",
      "The RMSE score of LassoCV on train is 0.08632465296963263\n"
     ]
    }
   ],
   "source": [
    "# 评估，使用RMSE评价模型在测试集和训练集上的性能\n",
    "#测试集\n",
    "print ('The RMSE score of LassoCV on test is', mean_squared_error(y_test, y_test_pred_lasso)**0.5)\n",
    "#训练集\n",
    "print ('The RMSE score of LassoCV on train is', mean_squared_error(y_train, y_train_pred_lasso)**0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 0.00043984208333395505\n"
     ]
    }
   ],
   "source": [
    "import numpy as np  # 矩阵操作\n",
    "mses = np.mean(lasso.mse_path_, axis = 1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses) \n",
    "#plt.plot(np.log10(lasso.alphas_)*np.ones(3), [0.3, 0.4, 1.0])\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()    \n",
    "            \n",
    "print ('alpha is:', lasso.alpha_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结论：从特征系数可以看出，雨雪天气和春季骑车用户减少，气温temp和体感温度atemp的影响也很大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对比：\n",
    "\n",
    "1）最小二乘线性回归模型的特征系数非常大，性能较岭回归模型和Lasso模型差，原因应该是没有正则项对特征系数进行惩罚，导致特征系数膨胀，过拟合较Ridge和Lasso严重；\n",
    "2）L1和L2正则也会收缩回归系数，所以Ridge和Lasso回归模型特征系数比最小二乘线性回归模型小很多，性能更好；\n",
    "3）L1正则使得有些线性回归系数为0，得到稀疏模型，Lasso比Ridge的回归系数更少，如Lasso星期三和四，月份4和8系数都是0。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
